package com.itheima.mapper;

import com.itheima.domain.Users;
import org.apache.ibatis.annotations.*;

import java.time.LocalDateTime;
import java.util.List;

@Mapper // 标识这是一个操作数据库的mapper接口,将来mybatis会自动为这个接口生成一个实现类（代理类）
public interface UserMapper {

    //查询所有用户
    @Select("select * from users")
    List<Users> findAll();

    @Select("select * from users where id = #{id}")// #{} 占位符
    Users findById(Integer id);

    /**
     * 新增用户
     * <p>
     * 注解Insert 注解用于插入数据
     * values 前面括号中的参数为数据库中的字段名
     * 后面括号中的参数为实体类中的属性名
     *
     * @param users 实体类
     * @return 影响的行数
     */
    @Insert("insert into users (name,  username, password, email, age, math_score, english_score, address, created_at) " +
            "values (#{name}, #{username}, #{password}, #{email}, #{age}, #{mathScore}, #{englishScore}, #{address}, #{createdAt})")
    int insert(Users users);

    /**
     * 根据id修改用户
     *
     * @param users
     * @return 受影响的行数
     */
    @Update("update users set name = #{name}, username = #{username}, password = #{password}, email = #{email}, age = #{age}, math_score = #{mathScore}, english_score = #{englishScore}, address = #{address}, created_at = #{createdAt} where id = #{id}")
    int update(Users users);

    /**
     * 根据id删除用户
     *
     * @param id
     * @return 受影响的行数
     */
    @Delete("delete from users where id = #{id}")
    int deleteById(Integer id);

    /**
     * 根据条件查询用户
     * CONCAT 函数 作用：拼接字符串
     * @Param 注解 作用：将参数封装到sql语句中
     *
     * @param username 用户名
     * @param name     姓名
     * @param begin    开始时间
     * @param end      结束时间
     * @return 查询导的用户集合
     *
     */
    @Select("SELECT * FROM users\n" +
            "WHERE username = #{username}\n" +
            "AND NAME LIKE CONCAT('%',#{name},'%')\n" +
            "AND created_at BETWEEN #{begin} AND #{end}")
    List<Users> selectByCondition(@Param("username") String username,
                                  @Param("name") String name,
                                  @Param("begin") LocalDateTime begin,
                                  @Param("end") LocalDateTime end);

    /**
     * 利用动态sql实现
     *
     * @param username
     * @param name
     * @param begin
     * @param end
     * @return
     */
    List<Users> selectByConditionWithDynamicSql(@Param("username") String username,
                                                @Param("name") String name,
                                                @Param("begin") LocalDateTime begin,
                                                @Param("end") LocalDateTime end);
}


